package com.gupao.javavip.gof.singleton;

/**
 * ThreadLocal线程单例模式
 * <p>
 * 优点：同一个线程下共享一个对象实例。其他懒汉单例模式为了达到线程安全的目的，给方法上锁，以时间换空间。ThreadLocal将所有的对象全部放在 ThreadLocalMap 中，为每个线程都提供一个对象，实际上是以空间换时间来实现线程间隔离的。
 * 缺点：不同的线程下存在同一个对象的不同实例。
 * <p>
 */
public class ThreadLocalSingleton {
    //static保证类初始化时便实例化
    private static final ThreadLocal<Context> THREAD_LOCAL_INSTANCE =
            ThreadLocal.withInitial(() -> {
                Context context = new Context();
                context.setConfig1("config1");
                context.setConfig2("config2");
                return context;
            });

    //构造方法私有化
    private ThreadLocalSingleton() {
    }

    //提供全局访问点
    public static Context getInstance() {
        return THREAD_LOCAL_INSTANCE.get();
    }

    public static class Context {
        private String config1;
        private String config2;

        public String getConfig1() {
            return config1;
        }

        public void setConfig1(String config1) {
            this.config1 = config1;
        }

        public String getConfig2() {
            return config2;
        }

        public void setConfig2(String config2) {
            this.config2 = config2;
        }
    }
}
